#include<stdio.h>
#include<unistd.h>
#include<sys/time.h>
#include<sys/select.h>
#define BUF_SIZE 30
//select函数调用实例
int main(int argc,char *argv[])
{
	fd_set reads,temps;
	int result,str_len;
	char buf[BUF_SIZE];
	struct timeval timeout;
	FD_ZERO(&reads);
	FD_SET(0,&reads);//0是标准输入，控制台
	while(1)
	{
		//调用select函数后，除发生变化的文件描述符对应位外，剩下的所有位将初始化为0
		//因此，为了记住初始值，必须经过这种复制过程
		temps=reads;
		timeout.tv_sec=5;
		timeout.tv_usec=0;
		//int select(int maxfd,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval *timeout)
		//maxfd监视对象文件描述符数量
		//readset将所有关注“是否存在待读取数据”的文件描述符注册到fd_set型变量，并传递其地址值。
		//writeset将所有关注“是否可传输无阻塞数据”的文件描述符注册到fd_set型变量，并传递其地址值
		//exceptset将所有关注“是否发生异常”的文件描述符注册到fd_set型变量，并传递其地址值。
		//timeout调用select函数后，为防止陷入无限阻塞的状态，传递超时信息
		//返回值发生错误时返回-1，超时返回时返回0.因发生关注的事件返回时，返回大于0的值，该值是发生事件的文件描述符数
		result=select(1,&temps,0,0,&timeout);
		if(result==-1)
		{
			puts("select() error");
			break;
		}
		else if(result==0)
		{
			puts("Time-out!");
		}
		else
		{
			//select函数返回大于0的值时运行的区域
			//验证发生变化的文件描述符是否为标准输入
			if(FD_ISSET(0,&temps))
			{
				str_len=read(0,buf,BUF_SIZE);
				buf[str_len]=0;
				printf("message from console:%s",buf);
			}
		}
	}
	return 0;
}
